package com.zyf.pattern.observer.core;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;

/**
 * 观察者
 * 事件的注册和监听
 * create by yifeng
 */
public class EventListener  {

    // map相当于是一个注册器
    // JDK底层Lisenter通常也是这样设计
    protected Map<Enum, Event> events = new HashMap<>();

    public void addLisenter(Enum eventType, Object target, Method callback) {

        // 注册事件
        // 用反射调用这个方法
        events.put(eventType, new Event(target, callback));

    }

    // 触发，只要有动作就触发
    private void trigger(Event e) {
        e.setSource(this);
        e.setTime(System.currentTimeMillis());

        try {
            // 发起回调
            e.getCallback().invoke(e.getTarget(), e);
        } catch (IllegalAccessException e1) {
            e1.printStackTrace();
        } catch (InvocationTargetException e1) {
            e1.printStackTrace();
        }

    }

    // 触发事件的源头，根据时间类型触发
    protected void trigger(Enum call) {
        if (!this.events.containsKey(call)) {
            return;
        }
        trigger(this.events.get(call).setTrigger(call.toString()));
    }


}
